/*
 * Copyright (c) 2018.
 * http://www.ulabcare.com
 */

package com.mt.roll.core.constants;

import com.mt.roll.core.utils.StringUtils;

/**
 * redis key 常量定义类，为了防止key冲突，第一个命名空间尽量定义在该类中。
 * <p>
 * 建议使用命名空间格式设置key名称：
 * <p><pre>
 * 1.1 key = 用途:业务限定:key。
 * 例如：lock:order:xxx; sequence:order_no:xxx
 * 1.2 key采用小写结构，不采用驼峰格式，中间利用下滑线(_)做连接，例如：user_name、user_pass。
 * 1.3 key的长度限制在128字节之内，既可以节省空间，又可以加快查询速度。
 * </pre></p>
 *
 * @author jiff
 * @date 2018/11/1
 * @since 1.0
 */
public interface RedisConstant {
    /**
     * key命名空间分隔符{@value}
     */
    String KEY_NAMESPACE_SEPARATOR = ":";

    /**
     * 分布式锁的key命名空间
     */
    String LOCK_PREFIX = "lock:";

    /**
     * 短信的key命名空间{@value}
     */
    String SMS_PREFIX = "sms";

    /**
     * 微信的key命名空间{@value}
     */
    String WECHAT_PREFIX = "wechat";

    /**
     * 生成短信验证码键值
     *
     * @param mobile 手机号码
     * @return key
     */
    static String genSmsCodeKey(String mobile) {
        return genKey(SMS_PREFIX, "code", mobile);
    }

    /**
     * 生成微信oauthCode键值
     *
     * @param appId     appId
     * @param oauthCode oauthCode
     * @return key
     */
    static String genWechatOauthCodeKey(String appId, String oauthCode) {
        return genKey(WECHAT_PREFIX, "oauth_code", appId, oauthCode);
    }

    /**
     * 生成微信jsApiTicket键值
     *
     * @param appId appId
     * @return key
     */
    static String genWechatJsApiTicketKey(String appId) {
        return genKey(WECHAT_PREFIX, "wechat_jsapi_ticket", appId);
    }


    /**
     * 生成微信weChatAccessTokenCode键值
     *
     * @param appId appId
     * @return key
     */
    static String genWechatAccessTokenCodeKey(String appId) {
        return genKey(WECHAT_PREFIX, "wechat_access_token", appId);
    }

    /**
     * 生成redis键值
     *
     * @param keys 键值数组
     * @return key0:key1:key2:keyN
     */
    static String genKey(String... keys) {
        return StringUtils.join(keys, KEY_NAMESPACE_SEPARATOR);
    }
}
